package com.yan.design.two.behavior.s4;

import org.apache.commons.collections.iterators.ArrayIterator;

import java.util.Iterator;

/**
 * 4. 迭代器模式
 *     自定义的集合类
 * @author shengren.yan
 * @create 2022-08-09
 */
public class ArrayCollection<T> implements Iterable{

    // 底层使用数组存放数据
    private final T[] array;

    private ArrayCollection(T[] a) {
        this.array = a;
    }

    // 静态方法把数组转成 ArrayCollection集合  - 也可以直接new对象
    public static <T> ArrayCollection<T> of(T[] a) {
        return new ArrayCollection<>(a);
    }

    @Override
    public Iterator iterator() {
        return new ArrayIterator();
    }

    // 不要静态，使用的对象存数组
    public class ArrayIterator implements Iterator<T>{
        // 指针表示当前迭代位置
        private int cur = 0;

        // 判断是否还有下一个元素
        @Override
        public boolean hasNext() {
            // 如果指针大于数组长度，不再继续
            return cur < array.length;
        }

        // 返回当前指针位置并向前移动一位
        @Override
        public T next() {
            // 正常返回对应位置元素
            return array[cur++];
        }
    }
}
